package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.junit.AfterClass;
import org.junit.BeforeClass;

import dao.FabriqueDAO;
import modele.Formateur;
import modele.Personne;

import java.sql.Date;

public class FormateurDAO {

	static Connection con = null;
	static String sql = "INSERT INTO `agriotes` . `formateur` (`id_personne`,`diplome`,`presentation`,`url_photo`) VALUES (?, ?, ?, ?);";
	static String sqlmaj = "UPDATE  `agriotes`.`formateur` SET  `id_personne` =  ?, `diplome` = ?, presentation = ? WHERE  `personne`.`id_personne` = ?";
	static String sqldel = "DELETE FROM `agriotes`.`formateur` WHERE `formateur`.`id_formateur` = ?";
	static String sqlcid = "SELECT * FROM formateur INNER JOIN personne ON formateur.id_personne = personne.id_personne WHERE formateur.id_personne = ?";

	/** Insere le formateur dans la base. NOT YET TESTED !! */
	public void inserer(Formateur f) throws SQLException {

		try {
			con = FabriqueDAO.getConnection();
			// Demarrer une transaction
			con.setAutoCommit(false);
			// Inserer les donnees de personne

			PersonneDAO dao = new PersonneDAO();
			dao.inserer(f, con);

			PreparedStatement ps = con.prepareStatement(sql);
			ps.setInt(1, f.getIdPersonne());
			ps.setString(2, f.getDiplome());
			ps.setString(3, f.getPresentation());
			ps.setString(4, f.getUrlphoto());

			ps.executeUpdate();
			con.commit();
		} catch (SQLException e) {
			// Annuler les insersions
			con.rollback();
			throw e;
		}

	}

	// MAJ Formateur--------------------------------

	public void majFormateur(Formateur f) throws SQLException {

		try {
			con = FabriqueDAO.getConnection();
			// Demarrer une transaction
			con.setAutoCommit(false);
			// Inserer les donnees de personne

			Personne p = new Personne(-1, f.getNom(), f.getPrenom(),
					f.getDate_naissance(), f.getTelephone(), f.getAdresse(),
					f.getCode_postal(), f.getVille(), f.getEmail(),
					f.getPassword());

			PersonneDAO dao = new PersonneDAO();
			dao.modifier(p, con);

			PreparedStatement ps = con
					.prepareStatement(PersonneDAO.SQL_MODIFIER_PERSONNE);
			ps.setString(2, f.getDiplome());
			ps.setString(3, f.getPresentation());
			ps.setString(3, f.getUrlphoto());

			ResultSet rs = ps.executeQuery();

			// Valider les deux insersions
			con.commit();
		} catch (SQLException e) {
			// Annuler les insersions
			con.rollback();
			throw e;
		}

	}

	// Effacer ---------------------------------------

	public void effacer(Formateur f) {

		try {
			con = FabriqueDAO.getConnection();
			PreparedStatement ps = con.prepareStatement(sqldel);
			ps.setInt(1, f.getIdPersonne());

			ResultSet rs = ps.executeQuery();
		} catch (SQLException e) {
			System.out.println("Del impossible");
		}
	}

	// Lister formateur ------------------------------------
	public List<Formateur> listerFormateur() throws SQLException {

		ArrayList<Formateur> tableauFormateur = new ArrayList<>();
		String sqla = "SELECT * FROM formateur INNER JOIN personne ON formateur.id_personne = personne.id_personne ORDER BY nom";

		con = FabriqueDAO.getConnection();
		PreparedStatement ps = con.prepareStatement(sqla);
		ResultSet rs = ps.executeQuery();

		while (rs.next()) {
			Formateur f = new Formateur(rs.getInt("personne.id_personne"),
					rs.getString("nom"), rs.getString("prenom"),
					rs.getDate("date_naissance"), rs.getString("telephone"),
					rs.getString("adresse"), rs.getString("code_postal"),
					rs.getString("ville"), rs.getString("email"),
					rs.getString("password"), rs.getString("diplome"),
					rs.getString("presentation"), rs.getString("url_photo"));
			tableauFormateur.add(f);
		}
		return tableauFormateur;
	}

	// Lire par ID ------------------------------------------------------

	public Formateur lireParId(int id) throws SQLException {

		Formateur f = null;

		PreparedStatement pt = con.prepareStatement(sqlcid);

		pt.setInt(1, id);
		ResultSet rs = pt.executeQuery();
		if (rs.next()) {

			f = new Formateur();

			f.setIdPersonne(rs.getInt("id_personne"));
			f.setNom(rs.getString("nom"));
			f.setPrenom(rs.getString("prenom"));
			f.setDate_naissance(rs.getDate("date_naissance"));
			f.setTelephone(rs.getString("telephone"));
			f.setAdresse(rs.getString("adresse"));
			f.setVille(rs.getString("ville"));
			f.setEmail(rs.getString("email"));
			f.setPassword(rs.getString("password"));
			f.setCode_postal(rs.getString("code_postal"));
			f.setDiplome(rs.getString("diplome"));
			f.setPresentation(rs.getString("presentation"));
			f.setUrlphoto(rs.getString("url_photo"));
		}

		return f;

	}

}
